/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package problema_puente;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Gaby
 */
public class Ejecutor {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        /**
         * Declaracion de una lista ordenada HashMap en donde se almacenan los
         * elementos como claves y como valor, los tiempo de cada uno de ellos
         */
        HashMap<String, Integer> mapa = new HashMap<String, Integer>();
        mapa.put("A", 1);
        mapa.put("B", 2);
        mapa.put("C", 5);
        mapa.put("D", 10);

        //Lista de tipo array en donde se encuentran todos los elementos que
        //van a cruzar el puente
        List<String> elementos = new ArrayList<String>();
        elementos.add("A");
        elementos.add("B");
        elementos.add("C");
        elementos.add("D");

        /**
         *El metodo solucion de la clase CrucePuente se va a jecutar n veces,
         * para verificar su comportamiento. Para esto se incluye al metodo en
         * un ciclo que se ejecutara el numero de veces que se indique como parametro
         * Ademas se miden los tiempo de ejecucion en nanosegundo(ns)
         */

        //op es el parametro que indica la cantidad de ejecuciones del metodo solucion
        int op = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingrese el numero de iteraciones:"));
        //captura el tiempo inicial antes de la ejecucion del metodo
        long tInicioTotal = System.nanoTime();
        //variable que alamcena el menor tiempo de ejecucion
        int tMenor = 0;
        //variable que alamacena el numero de la ietracion con menor tiempo
        int aux = 0;

    
            for (int i = 1; i <= op; i++) {
            long tInicioIteracion = System.nanoTime();
            System.out.print("\nIteracio" + i + "\n");

            CrucePuente.solucion(new LinkedList<String>(elementos), new LinkedList<String>(), mapa);

            System.out.print("Secuencia\t" + CrucePuente.secuencia + "\n");
            System.out.print("Tiempo total " + CrucePuente.tiempoTotal + " min\n");

            //CALCULA EL MENOR DE LOS TIEMPO DE CADA ITERACION
            if (tMenor != 0) {
                if (CrucePuente.tiempoTotal < tMenor) {
                    tMenor = CrucePuente.tiempoTotal;
                    aux = i;
                }
            } else {
                tMenor = CrucePuente.tiempoTotal;
                aux = i;
            }
            long tFinalIteracion = System.nanoTime() - tInicioIteracion;
            System.out.println("El tiempo de ejecucion de Iteracion " + i + " es: " + tFinalIteracion + " ns");
            System.out.println("-----------------------------------------------");
        }

        System.out.print("Menor tiempo " + tMenor + " en la Iteracion " + aux + "\n");
        long tiempoEjec = System.currentTimeMillis() - tInicioTotal;
        System.out.println("El tiempo de ejecucion: " + tiempoEjec + " ns");

        
    }
}
